home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 2 / LSD and 17bit Compendium Deluxe - Volume II.iso / a / prog / asmsrc / tango2.lha / SOURCES / 1PIXSINE.S < prev    next >
Text File  |  1988-07-19  |  12KB  |  571 lines

  1. ;    ** RAY SEE IF KODAK CAN MAKE THIS ANY BETTER **
  2. ; ** 2 PIXEL ACCURACY SINE WAVE BY TANGO OF CRYPTIC **
  3. ;     ** ONLY SPREAD SOURCE TO CRYPTIC MEMBERS **
  4.  
  5.     opt c-
  6.     section blitter,code_c            Chip Ram please !!
  7.     include    df1:definitions            Give me some hardware reggies
  8.     include    df1:macros                Give me some macros
  9.     
  10.         
  11. ;LOCAL CONSTANTS
  12.  
  13. icra        equ $bfed01                
  14. allocmem     =-30-168                
  15. freemem     =-30-180                
  16.  
  17. TAKEOVER:
  18.  
  19. ; KILL SYSTEM COPPER, KEYBOARD ETC.....
  20.  
  21.     LEA custom,a5        
  22.     LEA GFXLIB(PC),a1             Point to 'graphics.library'
  23.     MOVEQ #0,D0                     Doesn't matter which version
  24.      MOVE.L 4.w,a6                 EXECBASE
  25.     jsr    -132(a6)                 task switching off (forbid)
  26.      JSR -$228(a6)                  Openlibrary
  27.      MOVE.L D0,GFXBASE             Store library address
  28.  
  29.         
  30. ;Now put the graphic addresses in the CopperList         
  31.  
  32.  
  33.      move.l    #sprite,d1            
  34.      move.w    d1,sp0lo+2
  35.      swap    d1
  36.      move.w    d1,sp0hi+2
  37.  
  38.  
  39.      move.l GFXBASE,d0            Move gfxbase offset to d0
  40.      MOVE.L D0,A6                
  41.      MOVE.W #$80,dmacon(a5)        Turn off copper whilst changing it
  42.      MOVE.L $32(A6),WBCOPPER         Store old (WBench) copper address
  43.      MOVE.L #OURCOPPER,$32(A6)    Point to new copper list (our own)
  44.      MOVE.W #$8080,dmacon(a5)    re-enable copper
  45.  
  46.      MOVE.W #$8010,intena(a5)        
  47.      MOVE.L $6c,old                Save work bench interrupt
  48.      MOVE.L #LEV3,$6c            This sets up a level 3 interrupt
  49.     move.w    intenar(a5),systemints
  50.     move.b    #%01111111,icra        Kill keyboard
  51.         
  52. WAIT:     
  53.     BTST #6,$BFE001                This waits for the left
  54.      BNE.S    WAIT                mouse button to be pressed
  55.     move.l    4.w,a6                EXECBASE
  56.      MOVE.L old,$6c                Restore system interrupts
  57.     MOVE.L GFXBASE,A6
  58.      MOVE.W #$80,dmacon(a5)        Disable DMA
  59.      MOVE.L WBCOPPER,$32(A6)        Restore old copperlist
  60.      MOVE.W #$8080,dmacon(a5)    Enable DMA
  61.      move.w    systemints,d0        Systems interrupt
  62.      or.w    #$c000,d0
  63.      move.w    d0,intena(a5)        Enable OS interrupts
  64.      move.b    #%10011011,icra        Enable keyboard
  65.     clr.w    $dff0a8                Clear music
  66.     clr.w    $dff0b8
  67.     clr.w    $dff0c8
  68.     clr.w    $dff0d8
  69.     move.w    #$f,$dff096
  70.     CLR.L    D0
  71.     rts
  72.  
  73.  
  74. ERROR:    
  75.     move.l 4.w,a6                Get EXECBASE
  76.     jsr    -138(a6)                Permit ( multi-tasking on )
  77.     moveq    #0,d0                Clear d0
  78.      RTS                            Return to AmigaDOS
  79.  
  80.  
  81. ;This is the NEW level 3 interrupt
  82.  
  83. LEV3:
  84.      MOVEM.L d0-d7/a0-a6,-(sp)    Save all registers to the stack
  85.     lea    custom,a5
  86.     AND #$10,intreqr(a5)           Check if interrupt is from Copper 
  87.     BNE out
  88.     move.w    #$8010,$9c                                
  89.     
  90.  
  91. ; ** ALL ROUTINES CALLED (HOPEFULLY) EVERY VBI **
  92.  
  93.     MOVE.W #$FFF,$DFF180
  94.     bsr    try_sin
  95.     bsr    testscroll
  96.  
  97.      move.l    sin_screen,d1        Bitplane memory address
  98.     move.w    d1,bp1lo+2            Used for double buffering
  99.      swap    d1
  100.      move.w    d1,bp1hi+2
  101.  
  102.     bsr        move_stars
  103.     MOVE.W #$000,$DFF180
  104.     
  105.     
  106. out:     
  107.     MOVEM.L (sp)+,d0-d7/a0-a6    Restore the registers
  108.     DC.W $4ef9                    hex value for  JMP instruction
  109. old:     
  110.     DC.L 0                        will jump to normal interrupt
  111.  
  112.  
  113. ; ** Move the sprites **
  114.  
  115. move_stars:
  116.  
  117.     sub.b    #$1,x+1
  118.     sub.b    #$2,x+9
  119.     sub.b    #$1,x+17
  120.     sub.b    #$3,x+25
  121.     sub.b    #$2,x+33
  122.     sub.b    #$4,x+41
  123.     sub.b    #$2,x+49
  124.     sub.b    #$1,x+57
  125.     sub.b    #$3,x+65
  126.     sub.b    #$1,x+73
  127.     sub.b    #$2,x+81
  128.     sub.b    #$4,x+89
  129.     sub.b    #$3,x+97
  130.     sub.b    #$2,x+105
  131.     sub.b    #$1,x+113
  132.     sub.b    #$4,x+121
  133.     sub.b    #$3,x+129
  134.     sub.b    #$3,x+137
  135.     sub.b    #$2,x+145
  136.     sub.b    #$4,x+153
  137.     sub.b    #$1,x+161
  138.     sub.b    #$3,x+169
  139.     sub.b    #$1,x+177
  140.     sub.b    #$2,x+185
  141.     sub.b    #$4,x+193
  142.     sub.b    #$1,x+201
  143.     sub.b    #$3,x+209
  144.     sub.b    #$1,x+217
  145.     sub.b    #$2,x+225
  146.     sub.b    #$2,x+233
  147.     rts
  148.  
  149.  
  150. ; ** Double Buffer The Screen **
  151.  
  152. Buff:
  153.     Eor.l    #10240,Tango                ; Next screen is 10240 bytes along
  154.     Move.l    Tango,D1
  155.     Move.l    #SinePlane,d2
  156.     Add.l    D1,d2
  157.     Move.l    D2,Sin_Screen
  158.     Rts
  159.  
  160.  
  161. ; ** THE SCROLL ROUTINE **
  162.  
  163. testscroll:
  164.     tst.l    stopper
  165.     beq.s    scroll
  166.     sub.l    #1,stopper
  167.     rts
  168. scroll:
  169.     cmp.l    #15*4,val                Blitshifted all <<<
  170.     blo.s    coarse_scroll_it        No then get doing it !!
  171.     bsr        blit_char                Blit letter to screen
  172.     clr.l    val                        Reset index
  173. coarse_scroll_it:
  174.     bsr        coarse                    Scroll all line
  175.     rts                            
  176.     
  177.     
  178. ; ** BLIT LETTER ON THE SCREEN **
  179.  
  180. blit_char
  181.     jsr        text
  182.     lea        custom,a5                Get custom chip address
  183.     move.l    screenx,a0                 Can~t see this picture !!
  184.     move.l    #font,a1                 Put font in blitter source
  185.     add.l    d1,a1
  186. blit_test:
  187.     btst    #14,$dff002                 Blitter busy !!!
  188.     bne    blit_test                     Lets wait till she finishes !
  189.     move.w    #$ffff,bltafwm(a5)        
  190.     move.w    #$ffff,bltalwm(a5)        
  191.     move.l    a0,bltdpth(a5)             Blitter dest D (BOTTOM OF SCREEN)
  192.     move.l    a1,bltapth(a5)             Blitter source A (SCROLLING FONT)
  193.     move.w    #38,bltamod(a5)             Modulo (20-1)*2
  194.     move.w    #38,bltdmod(a5)             Modulo (20-1)*2
  195.     move.w    #$9f0,bltcon0(a5)         Minterms D=A
  196.     clr.w    bltcon1(a5)                 Set Ascending mode
  197.      move.w    #16*64+1,bltsize(a5)     Blit size (SIZE OF FONT)
  198.     rts                                  Return
  199.  
  200.  
  201. ; ** BLITSHIFT THE ENTIRE SCROLL LINE **
  202.  
  203. coarse:
  204.     lea        custom,a5                 
  205.     move.l    screenx,a0                ; Can~t see this picture !!
  206.     move.l    a0,a1
  207.     add.l    #2,a1
  208. blit_wait:
  209.     btst    #14,$dff002            
  210.     bne        blit_wait
  211.     incl    #4,val                    ; (1 for slower)
  212.     move    #15,d7                    ; Amount of pixels to shift(15 for slow)
  213.     ror        #4,d7                    ; Set to correct bits (12-15)
  214.     or        #%100111110000,d7        
  215.     move.l    #-1,bltafwm(a5)
  216.     move.l    a1,bltapth(a5)
  217.     move.l    a0,bltdpth(a5)
  218.     move.w    #0,bltamod(a5)
  219.     move.w    #0,bltdmod(a5)
  220.     move.w    d7,bltcon0(a5)    
  221.     move.w    #80*64+20,bltsize(a5)
  222.     rts    
  223.  
  224.  
  225. ; ** BLITTER CLEAR WHERE THE SINE SCROLL HAS JUST BEEN **
  226.  
  227. CLEAR:
  228.     Move.l    Sin_Screen,a0
  229. wate
  230.     btst    #14,$dff002
  231.     bne.s    wate
  232.     Move.l    a0,Bltdpth(a5)
  233.     Move    #0,Bltdmod(a5)
  234.     Move.l    #$1f00000,Bltcon0(a5)
  235.     Move    #150*64+20,Bltsize(a5)
  236.     Rts
  237.  
  238.  
  239. ; ** DO THE SINEWAVE **
  240. ; BLITTER HAS TO COPY EVERY 2 PIXELS ACROSS, THATS ALOT OF WORK !!!
  241.  
  242. try_sin:
  243.     Bsr        buff
  244.     bsr        clear
  245.     Move.l    Table1,A3
  246.     Move.b    (A3),d1
  247.     Cmp.b    #$ff,d1
  248.     Bne        ItsOkYa
  249.     Move.l    #SinTab,A3
  250. ItsOkYa
  251.     Add.l    hi_amplitude,A3
  252.     Move.l    a3,Table1
  253.     Move.l    A3,Table
  254.     lea        custom,a5                 
  255.     MOVE.W    #$DFC,D2                ; D=A+B
  256.     LEA        BLTAFWM(A5),A2            ; FWM           IN A2
  257.     LEA     BLTSIZE(A5),A4            ; BLITSIZE        IN A4
  258.     LEA        BLTAPTH(A5),A6
  259.     MOVE.W    #16*64+1,D7                ;                IN D3
  260.     move.l    screenx,a0                 ; Source A
  261.     move.l    #18,d4                    ; Number of chars along screen
  262.     clr.l    d5
  263.     clr.l    d6
  264. ban:
  265.     MOVE.W    #%1000000000000000,d3    ; PUT TO 1 FOR ONE PIXEL 
  266. blit_test0:      
  267.     BSR        BLIT_WAITMAN
  268.     move.w    D2,bltcon0(a5)         
  269.     clr.w    bltcon1(a5)                 
  270.     move.w    #38,bltamod(a5)             
  271.     move.w    #38,bltdmod(a5)             
  272.     move.w    #38,bltbmod(a5)             
  273.      REPT    16
  274.     move.l    sin_screen,a1
  275.     bsr        get_sinvalue
  276.     move.w    d3,(A2)                    ; FWM MASK
  277.     move.l    a1,bltdpth(a5)             
  278.     move.l    a1,bltbpth(a5)             
  279.     move.l    a0,(A6)
  280.     MOVE.W    D7,(A4)                    ; BLITSIZE
  281.     LSR        #1,D3
  282.     ENDR
  283.     add.l    #2,a0                    ; Get next letter along
  284.     add.l    #2,d6
  285.     dbf        d4,ban
  286.     rts                                  
  287.  
  288.  
  289.  
  290. BLIT_WAITMAN:
  291.     BTST    #14,$DFF002
  292.     BNE.S    BLIT_WAITMAN
  293.     RTS
  294.     
  295.     
  296. get_sinvalue:
  297.     Clr.l    D5
  298.     Move.l    Table,A3
  299.     Move.b    (A3),d5
  300.     cmp.b    #$ff,d5
  301.     bne        cryptic90
  302.     Move.l    #SinTab,A3
  303.     Move.b    (a3),d5
  304. cryptic90
  305.     Add.l    lo_amplitude,A3
  306.     Move.l    A3,Table
  307.     mulu    #40,d5
  308.     add.l    d5,a1
  309.     Add.l    D6,A1
  310.     rts
  311. Table1:    Dc.l    SinTab    
  312. table:    dc.l    sintab
  313.  
  314.  
  315. ; ** RAY SEE IF YOU CAN GET A BETTER SINUS TABLE FOR FULL SCREEN !!! **
  316. sintab:
  317.     dc.b $3C,$3F,$42,$46,$49,$4C,$50,$53,$56,$59
  318.     dc.b $5C,$5F,$61,$64,$67,$69,$6B,$6D,$6F,$71
  319.     dc.b $72,$73,$75,$76,$76,$77,$77,$77,$77,$77
  320.     dc.b $77,$76,$76,$75,$73,$72,$71,$6F,$6D,$6B
  321.     dc.b $69,$67,$64,$61,$5F,$5C,$59,$56,$53,$50
  322.     dc.b $4C,$49,$46,$42,$3F,$3C,$38,$35,$31,$2E
  323.     dc.b $2B,$27,$24,$21,$1E,$1B,$18,$16,$13,$10
  324.     dc.b $E,$C,$A,$8,$6,$5,$4,$2,$1,$1
  325.     dc.b $0,$0,$0,$0,$0,$0,$1,$1,$2,$4
  326.     dc.b $5,$6,$8,$A,$C,$E,$10,$13,$16,$18
  327.     dc.b $1B,$1E,$21,$24,$27,$2B,$2E,$31,$35
  328.     dc.b $38,255
  329.      EVEN
  330.      
  331.  
  332. ; ** CHARACTER DECODER ROUTINE **
  333.  
  334. text:
  335.     move.l    acurent,a2                Get message
  336.     clr.l    d1                        
  337.     move.b    (a2)+,d1                Update it
  338.     move.b    d1,letter                Store in offset
  339.     cmp.b    #255,d1                    Check for end of message
  340.     beq.w    rst_text                If equal, then reset
  341.     cmp.b    #254,d1
  342.     beq        stop
  343.     sub.l    #32,d1                    Subract 32 (ie space)
  344.     asl        d1                        Times by 2 
  345.     move.l    a2,acurent                Update acurent
  346.     CMP.B    #"4",letter                Is letter "K" or larger
  347.     BPL.s    add_more                If larger then add on
  348.     rts                                Return
  349. add_more:
  350.     CMP.B    #"H",letter                Is letter "U" or larger
  351.     BPL.S    add_more2                If larger then add on
  352.     add.l    #40*15,d1                Get next line down (KLMNOPQRST)
  353.     rts
  354. add_more2:                    
  355.     add.l    #40*30,d1                Get next line down (UVWXYZ0123)
  356.     rts
  357. rst_text:
  358.     move.l    #0,d1
  359.     move.l    #message,d2                Get begining of text
  360.     move.l    d2,acurent                Reset to begining
  361.     rts                                Return
  362. stop:
  363.     move.l    #0,d1
  364.     add.l    #1,acurent
  365.     move.l    #150,stopper
  366.     rts
  367.  
  368. message:
  369.  
  370. ; 254=STOP,255=END.
  371.  
  372.     DC.B    " HI RAY    THIS IS A 2 PIXEL SINE SCROLL (HONESTLY!!)"
  373.     DC.B    "  CHECK OUT THE SINETABLE IN THE SOURCE AND SEE IF YOU CAN GET A BETTER AND BIGGER ONE TO GET FULL SCREEN"
  374.     DC.B    "  ALSO SEE IF KODAK CAN MAKE THIS RUN ANY FASTER COS ITS ABIT SLOOOOW"
  375.     DC.B    "  WRITE SOON....      PS. I'LL SEE YA ALL IN BLACKPOOL ON SATURDAY !!!!!"
  376.     DC.B    "   WRAP           ",255
  377.     EVEN
  378.             
  379.  
  380. ; ** THE COPPERLIST **
  381.  
  382. OURCOPPER:
  383. sp0lo:    dc.w    spr0ptl,$0000
  384. sp0hi:    dc.w    spr0pth,$0000
  385.         dc.w    bpl1mod,0,bpl2mod,0
  386.         dc.w    diwstrt,$2c81+16,diwstop,$2cc1
  387.         dc.w    bplcon0,$1200,bplcon1,$0000
  388.         dc.w    ddfstrt,$38,ddfstop,$d0
  389. *        dc.w    color00,$000,color01,$094
  390.         dc.w    color16,$aaa,color17,$aaa,color18,$aaa
  391.         dc.w    color19,$aaa,color20,$aaa
  392. bp1lo:    dc.w    bpl1ptl,$0000
  393. bp1hi:    dc.w    bpl1pth,$0000
  394.         wait    $2c09,$fffe
  395.         dc.w    color01,$f00
  396.         wait    $2e09,$fffe
  397.         dc.w    color01,$f11
  398.         wait    $3009,$fffe
  399.         dc.w    color01,$f00
  400.         wait    $3209,$fffe
  401.         dc.w    color01,$f11
  402.         wait    $3409,$fffe
  403.         dc.w    color01,$f22
  404.         wait    $3609,$fffe
  405.         dc.w    color01,$f33
  406.         wait    $389,$fffe
  407.         dc.w    color01,$f44
  408.         wait    $3a09,$fffe
  409.         dc.w    color01,$f55
  410.         wait    $3c09,$fffe
  411.         dc.w    color01,$f66
  412.         wait    $3e09,$fffe
  413.         dc.w    color01,$f77
  414.         wait    $4009,$fffe
  415.         dc.w    color01,$f88
  416.         wait    $4209,$fffe
  417.         dc.w    color01,$f99
  418.         wait    $4409,$fffe
  419.         dc.w    color01,$faa
  420.         wait    $4609,$fffe
  421.         dc.w    color01,$fbb
  422.         wait    $4809,$fffe
  423.         dc.w    color01,$fcc
  424.         wait    $4a09,$fffe
  425.         dc.w    color01,$fdd
  426.         wait    $4c09,$fffe
  427.         dc.w    color01,$fee
  428.         wait    $4e09,$fffe
  429.         dc.w    color01,$fff
  430.         wait    $5109,$fffe
  431.         dc.w    color01,$eef
  432.         wait    $5309,$fffe
  433.         dc.w    color01,$ddf
  434.         wait    $5509,$fffe
  435.         dc.w    color01,$ccf
  436.         wait    $5709,$fffe
  437.         dc.w    color01,$bbf
  438.         wait    $5909,$fffe
  439.         dc.w    color01,$aaf
  440.         wait    $5b09,$fffe
  441.         dc.w    color01,$99f
  442.         wait    $5d09,$fffe
  443.         dc.w    color01,$88f
  444.         wait    $5f09,$fffe
  445.         dc.w    color01,$77f
  446.         wait    $6109,$fffe
  447.         dc.w    color01,$66f
  448.         wait    $6309,$fffe
  449.         dc.w    color01,$55f
  450.         wait    $6509,$fffe
  451.         dc.w    color01,$44f
  452.         wait    $6709,$fffe
  453.         dc.w    color01,$33f
  454.         wait    $6909,$fffe
  455.         dc.w    color01,$22f
  456.         wait    $6a09,$fffe
  457.         dc.w    color01,$11f
  458.         wait    $6c09,$fffe
  459.         dc.w    color01,$00f
  460.         wait    $6e09,$fffe
  461.         dc.w    color01,$11f
  462.         wait    $7109,$fffe
  463.         dc.w    color01,$22f
  464.         wait    $7309,$fffe
  465.         dc.w    color01,$33f
  466.         wait    $7509,$fffe
  467.         dc.w    color01,$44f
  468.         wait    $7709,$fffe
  469.         dc.w    color01,$55f
  470.         wait    $7909,$fffe
  471.         dc.w    color01,$66f
  472.         wait    $7a09,$fffe
  473.         dc.w    color01,$77f
  474.         wait    $7c09,$fffe
  475.         dc.w    color01,$88f
  476.         wait    $7e09,$fffe
  477.         dc.w    color01,$99f
  478.         wait    $8009,$fffe
  479.         dc.w    color01,$aaf
  480.         wait    $8209,$fffe
  481.         dc.w    color01,$bbf
  482.         wait    $8409,$fffe
  483.         dc.w    color01,$ccf
  484.         wait    $8609,$fffe
  485.         dc.w    color01,$ddf
  486.         wait    $8809,$fffe
  487.         dc.w    color01,$eef
  488.         wait    $8a09,$fffe
  489.         dc.w    color01,$fff
  490.         wait    $8c09,$fffe
  491.         dc.w    color01,$fee
  492.         wait    $8e09,$fffe
  493.         dc.w    color01,$fdd
  494.         wait    $9109,$fffe
  495.         dc.w    color01,$fcc
  496.         wait    $9309,$fffe
  497.         dc.w    color01,$fbb
  498.         wait    $9509,$fffe
  499.         dc.w    color01,$faa
  500.         wait    $9709,$fffe
  501.         wait    $9909,$fffe
  502.         dc.w    color01,$f99
  503.         wait    $9b09,$fffe
  504.         dc.w    color01,$f88
  505.         wait    $9d09,$fffe
  506.         dc.w    color01,$f77
  507.         wait    $9f09,$fffe
  508.         dc.w    color01,$f66
  509.         end_copper
  510.         
  511.  
  512. ;LOCAL CONSTANTS
  513.  
  514. WBCOPPER:        DC.L    0
  515. GFXLIB:            DC.B     "graphics.library",0
  516. GFXBASE:        DC.L    0
  517. systemints:        dc.l    0
  518. scroll_offset:    dc.l    0
  519. screenx:        dc.l    picture
  520. letter:            dc.b    0
  521. acurent:        dc.l    message
  522. val:            dc.l    0
  523. lo_amplitude:    dc.l    1                        ; PISS AROUND WITH THESE
  524. hi_amplitude:    dc.l    2                        ; PISS AROUND WITH THESE
  525. Tango            Dc.l    0
  526. sin_screen:        Dc.l    SinePlane
  527. stopper:        dc.l    0
  528.  
  529.  
  530. ;BINARY FILES TO BE INCLUDED
  531.     EVEN
  532. picture    
  533.     dcb.b    10240,0
  534. SinePlane
  535.     dcb.b    10240,0
  536.     dcb.b    10240,0
  537. font
  538.     incbin    df1:neatfont.bin
  539. sprite:
  540.     include    df1:sprite.list
  541.  
  542.  
  543.  
  544.  
  545.  
  546.  
  547.     
  548.     
  549.  
  550.  
  551.  
  552.  
  553.  
  554.  
  555.  
  556.     
  557.     
  558.  
  559.  
  560.  
  561.  
  562.  
  563.  
  564.  
  565.  
  566.  
  567.  
  568.  
  569.     
  570.     
  571.